/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.dao;

import co.com.claro.administracionSolicitudes.dao.exceptions.NonexistentEntityException;
import co.com.claro.administracionSolicitudes.dao.exceptions.PreexistingEntityException;
import co.com.claro.administracionSolicitudes.dao.exceptions.RollbackFailureException;
import co.com.claro.administracionSolicitudes.entity.Grupo;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import co.com.claro.administracionSolicitudes.entity.Usuario;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Mike
 */
public class GrupoJpaController implements Serializable {

    public GrupoJpaController() {
        
    }
    
    @PersistenceContext
    private EntityManager em;
    
    public void create(Grupo grupo) throws PreexistingEntityException, RollbackFailureException, Exception {
        if (grupo.getUsuarioList() == null) {
            grupo.setUsuarioList(new ArrayList<Usuario>());
        }

        try {
            em.persist(grupo);
        } catch (Exception ex) {
            throw ex;
        } 
    }

    public void edit(Grupo grupo) throws NonexistentEntityException, RollbackFailureException, Exception {
        
        try {
            grupo = em.merge(grupo);
        } catch (Exception ex) {
            throw ex;
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException, RollbackFailureException, Exception {
        
        try {
            Grupo grupo;
            try {
                grupo = em.getReference(Grupo.class, id);
                grupo.getIdGrupo();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The grupo with id " + id + " no longer exists.", enfe);
            }
            em.remove(grupo);

        } catch (Exception ex) {
            throw ex;
        }
    }

    public List<Grupo> findGrupoEntities() {
        return findGrupoEntities(true, -1, -1);
    }

    public List<Grupo> findGrupoEntities(int maxResults, int firstResult) {
        return findGrupoEntities(false, maxResults, firstResult);
    }

    private List<Grupo> findGrupoEntities(boolean all, int maxResults, int firstResult) {

        CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
        cq.select(cq.from(Grupo.class));
        Query q = em.createQuery(cq);
        if (!all) {
            q.setMaxResults(maxResults);
            q.setFirstResult(firstResult);
        }
        return q.getResultList();
    }

    public Grupo findGrupo(Integer id) {
        return em.find(Grupo.class, id);
    }
    
    /**
     * Método que busca los grupos (roles) que tiene el sistema sin los usuarios asignados a el.
     * @param estado, estado del grupo; 1 = INACTIVO, 2 = ACTIVO
     * @return List<Grupo>, lista con los grupos disponibles en BD
     */
    public List<Grupo> findGrupoSinUsuarios(Short estado){
        List<Grupo> grupos = em.createNamedQuery("Grupo.findSinUsuarios")
                .setParameter("activo", estado).getResultList();
        return grupos;
    }

    public int getGrupoCount() {

        CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
        Root<Grupo> rt = cq.from(Grupo.class);
        cq.select(em.getCriteriaBuilder().count(rt));
        Query q = em.createQuery(cq);
        return ((Long) q.getSingleResult()).intValue();
    }
    
}
